
import axios, { AxiosInstance, AxiosRequestConfig } from "axios"
import {CacheEnum} from "@/enum/userEnum"
import router from "@/router"
import { ElMessage } from "element-plus"
import   utils from "@/utils/index"
export default class Axios{
    private instance:AxiosInstance

    constructor(config:AxiosRequestConfig){
        this.instance = axios.create(config)

        this.interceptors()
    }
   public async request<T,D=ResponseResult<T>>(config:AxiosRequestConfig){
     
     return new Promise( async (resolve,reject) => {
      try{
        const response= await this.instance.request<D>(config)
        resolve(response.data)
      }
      catch(err){
      reject(err)
      }

     }) as Promise<D>
   
    

   }

    private interceptors(){
        this.interceptorsRequest()
        this.interceptorsResponse()
    }


    private interceptorsRequest(){

        // 添加请求拦截器
        this.instance.interceptors.request.use( (config) =>{
    // // 请求之前携带token
    // config.headers={
    //  token:utils.store.get(CacheEnum.TOKEN_NAME)
    // }
    return config;
  }, 
     (error) =>{
    // 对请求错误做些什么
    return Promise.reject(error);
  });
   }
    private interceptorsResponse(){

        
// 添加响应拦截器
this.instance.interceptors.response.use( (response) =>{
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
  if(response.data.code===401 && sessionStorage.getItem("currentPage")!="auth.login"  ){
           utils.store.remove(CacheEnum.TOKEN_NAME)
         router.push({name:'auth.login'})
         ElMessage({
          type:"warning",
          message:'登录过期,请重新登录'
       })
  }
    return response;
  }, 
   (error) =>{
    // // 超出 2xx 范围的状态码都会触发该函数。
    // // 对响应错误做点什么
    // console.log(error);
    // switch(error.response.code){
    //   case 401:  //无权限,token异常
    //      utils.store.remove(CacheEnum.TOKEN_NAME)
    //      router.push({name:'login'})
    //      break
    // }
    return Promise.reject(error);
  });
    }



}